package com.example.meservice.interceptor;


import com.example.meservice.utils.CurrentHoler;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jodd.util.StringUtil;
import org.springframework.web.servlet.HandlerInterceptor;


/**
 * 用户身份信息拦截器
 * 用于从请求头中提取用户ID并绑定到当前线程上下文
 * 实现请求处理前后的用户信息管理
 *
 * @author czwa
 */
public class UserInterceptor implements HandlerInterceptor {

    /**
     * 请求处理前的拦截方法
     * 从请求头中获取user-id并设置到线程上下文中
     *
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @param handler 处理器对象
     * @return true表示继续处理请求，false表示拦截请求
     * @throws Exception 处理过程中发生的异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从请求头中获取用户ID
        String userId = request.getHeader("user-id");
        // 当用户ID存在时，设置到当前线程上下文
        if (StringUtil.isNotBlank(userId)) {
            CurrentHoler.set(Integer.parseInt(userId));
        }
        // 允许请求继续处理
        return true;
    }

    /**
     * 请求处理完成后的回调方法
     * 清除当前线程上下文中的用户ID，避免内存泄漏
     *
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @param handler 处理器对象
     * @param ex 请求处理过程中发生的异常（若无异常则为null）
     * @throws Exception 清理过程中发生的异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清除当前线程上下文中的用户ID
        CurrentHoler.remove();
    }
}